// ------------------------------------------------------------------------------------------------------------------------
// Plemiona.pl 8.X Skrypt użytkowy
//
// Nazwa:      Plemiona Runtime Agent
// Wersja:     3.0 Redistributable
// Autor:      Lukasz032 (Plemiona Authorized Scripter)
// Dostosował: Lukasz032 (Plemiona Authorized Scripter)
//
// Tagi specjalne:
// Licencja:   Creative Commons Uznanie autorstwa - Brak komercyjnego zastosowania - Na tych samych warunkach 3.0 Polska
// Informacje: http://creativecommons.org/licenses/by-nc-sa/3.0/pl
// Support:    skryptoteka@kurierplemiona.pl
//
// ------------------------------------------------------------------------------------------------------------------------
// ==UserScript==
// @name           Plemiona Runtime Agent
// @namespace      http://kurierplemion.pl/skryptoteka.html
// @description    Plemiona Runtime Agent
// @version        3.0 Redistributable
// @license        Creative Commons 3.0 BY-NC-SA (http://creativecommons.org/licenses/by-nc-sa/3.0/pl)
// @author         Lukasz032 (Plemiona Authorized Scripter)
// @include        http://pl*.plemiona.pl/game.php*
// ==/UserScript==
// ------------------------------------------------------------------------------------------------------------------------

function DS_userScript_SWFStore_Wrapper() {

PlemionaRALS = "redistrib";

JSON = {
  $specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'},
  
  $replaceChars: function(chr){
    return this.JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
  },
  
  encode: function(obj){
    switch (typeof obj){
      case 'string':
        return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"';
      case 'array':
        return '[' + String(obj.map(JSON.encode).clean()) + ']';
      case 'object': case 'hash':
        var string = [];
        for (var prop in obj) {
          if (obj.hasOwnProperty(prop)) {
            var json = JSON.encode(obj[prop]);
            if (json) {
              string.push(JSON.encode(prop) + ':' + json);
            }
          }
        }
        return '{' + string + '}';
      case 'number': case 'boolean': return String(obj);
      case false: return 'null';
    }
    return null;
  },
  
  decode: function(string, secure){
    if ((typeof string != 'string') || !string.length) return null;
    if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
    return eval('(' + string + ')');
  }
};


DS_userScript_SWFStore = {
  options : {
    SWFAddress : 'flashStorage.swf',
    storageName : 'myStorage',
    runAfter : function(){},
    logger : function(){}
  },
  doSaves : true,
	initialize : function (options) {
    options = options || {};
    this.options.SWFAddress = options.SWFAddress || this.options.SWFAddress;
    this.options.storageName = options.storageName || this.options.storageName;
    this.options.runAfter = options.runAfter || this.options.runAfter;
    this.options.logger = options.logger || this.options.logger;
    
    this.storageSuffix = "_" + this._time() + "_" + Math.round(Math.random() * 100000);
    this.createUniqueInstance();
    return this;
  },
  createUniqueInstance : function () {
    var browserId, value, date, div, object;
    value = document.cookie.match('(?:^|;)\\s*' + 'DS_userScript_SWFStore' + '=([^;]*)');
    browserId = (value) ? decodeURIComponent(value[1]) : null;
    if (!browserId) {
      browserId = Math.round(Math.random() * Math.PI * 100000);
      value = encodeURIComponent(browserId);
      date = new Date();
      date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
      value += '; expires=' + date.toGMTString();
      document.cookie = 'DS_userScript_SWFStore' + '=' + value;
    }
    
    div = document.createElement('div');
    div.id = 'DS_userScript_SWFStoreContainer'+this.storageSuffix;
    div.style.position = 'absolute';
    div.style.width = '300px';
    div.style.height = '200px';
    div.style.display = 'block';
    div.style.top = '100px';
    div.style.left = '-299px';
    div.style.overflow = 'hidden';
    document.getElementById('ds_body').appendChild(div);
    
    this.options.logger('System przechowywania danych - ładowanie flasha z adresu: '+this.options.SWFAddress,8);
    this.options.logger('System przechowywania danych - komentarz pamięci: '+this.storageSuffix,8);
    object = document.createElement('object');
    object.id = 'DS_userScript_SWFStore'+this.storageSuffix;
    object.width = '300px';
    object.height = '200px';
    object.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
    object.type = 'application/x-shockwave-flash';
    object.data = this.options.SWFAddress;
    object.innerHTML =
      '<param name="movie" value="' + this.options.SWFAddress + '" />'+
      '<param name="allowScriptAccess" value="always" />'+
      '<param name="quality" value="low" />'+
      '<param name="swLiveConnect" value="true" />'+
      '<param name="flashVars" value="storageReady=DS_userScript_SWFStore.contentReady&displaySettings=DS_userScript_SWFStore.displaySettings&settingsClosed=DS_userScript_SWFStore.settingsClosed" />'+
      '';
    
    div.appendChild(object);
    this.store = object;
  },
  contentReady : function () {
    var res = this.initStorage();
    if (res != 'STOR_CREATED' && res != 'STOR_READY') {
      this.options.logger('System przechowywania danych - kontenener nie stworzony: '+res, 0);
    } else {
      this.options.logger('System przechowywania danych - kontener załadowany poprawnie', 8);
      this.options.runAfter();
    }
  },
  initStorage : function() {
    this.options.logger('System przechowywania danych - obiekt pamięci lokalnej załadowany: `'+this.options.storageName+'`', 10);
    return this.store.initStorage(this.options.storageName);
  },
  getValue : function (key) {
    var res = this.store.getValue(key)
    this.options.logger('System przechowywania danych - pobieranie zapisu w bazie danych dla klucza '+key+'', 10);
    return res;
  },
  setValue : function(key, val) {
    if (this.doSaves) {
      if (typeof val != 'string') {
        val = JSON.encode(val);
      }
      this.options.logger('System przechowywania danych - zapisywanie wartości klucza: '+key, 10);
      return this.store.setValue(key, val);
    } else {
      this.options.logger('System przechowywania danych - obiekt nie zapisuje danych',0);
      return false;
    }
  },
  removeValue : function(key) {
    return this.store.removeValue(key);
  },
  removeStorage : function() {
    return this.store.removeStorage();
  },
  getSize : function() {
    return this.store.getSize();
  },
  getAllKeys : function() {
    return this.store.getAllKeys();
  },
  
  displaySettings : function() {
    this.options.logger('System przechowywania danych - wyświetlanie ostrzeżenia pojemności pamięci',8);
    this.doSaves = false;
    document.getElementById('DS_userScript_SWFStoreContainer'+this.storageSuffix).styles.left = '400px';
  },
  settingsClosed : function(flush_result) {
    if (flush_result == 'true') {
      this.doSaves = true;
      this.options.logger('System przechowywania danych - powiększenie pamięci nieudane', 8);
    } else {
      this.options.logger('System przechowywania danych - powiększenie pamięci zakończone', 8);
    }
    document.getElementById('DS_userScript_SWFStoreContainer'+this.storageSuffix).styles.left = '-299px';
  },
  _time : Date.now || function() {
    return +new Date;
  }
};

}

if ((typeof GM_getResourceURL) != "undefined") {
  if ((typeof unsafeWindow.DS_userScript_SWFStore) == 'undefined') {
    unsafeWindow.DS_userScript_SWFStore = {};
    unsafeWindow.JSON = {};
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.innerHTML = '(' + DS_userScript_SWFStore_Wrapper + ')();';
    script.charset = 'utf-8';
    document.body.appendChild(script);
  }
} else if ((typeof webkitStorageInfo) != "undefined") {
  if ((typeof DS_userScript_SWFStore) == 'undefined') {
    DS_userScript_SWFStore = {};
    JSON = {};
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.innerHTML = "(" + DS_userScript_SWFStore_Wrapper + ")();";
    script.charset = "utf-8";
    document.body.appendChild(script);
	}
} else {
  var DS_userScript_SWFStore, JSON, PlemionaRALS;
  DS_userScript_SWFStore_Wrapper();
}



function PRASWrapper() {

if ((typeof jQuery) == "undefined") {
  alert("Nie nastąpiło wymagane do pracy Runtime Agenta załadowanie framework'a JQuery. Prosimy spróbować póżniej.");
  return false;
}

// ----------------------
// - WŁAŚCIWY FRAMEWORK -
// ----------------------
PlemionaRuntimeAgent = {
  // ---------------------
  // -WEWNĘTRZNY DEBUGER -
  // ---------------------
    InitializeDebuger : function() {
      this.DebugerDiv = document.createElement("div");
      this.DebugerDiv.setAttribute("style", "background-color: #AAAAAA; font-family: Cambria; font-size: 8pt; position: fixed; z-index: 100; left: 60px; top: 100px; color: #663A02; width: 75%; height: 75%; overflow: auto; filter:alpha(opacity=90); opacity: 0.9; border: 2px solid black; display: none");
      this.DebugerDiv.innerHTML = "<b>Plemiona Runtime Agent Debuger - <a href=\"javascript:PlemionaRuntimeAgent.HideDebuger()\" style=\"color: white\">Ukryj debuger</a></b><br>"
      document.body.appendChild(this.DebugerDiv);
    },
    ShowDebuger : function() {
      $(this.DebugerDiv).fadeIn("slow");
    },
    HideDebuger : function() {
      $(this.DebugerDiv).fadeOut("slow");
    },
    OutputToConsole : function(data) {
      try {
        var debugerInfo = new Date().toString() + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + data + "<br>";
        window.setTimeout("PlemionaRuntimeAgent.DebugerDiv.innerHTML += \"" + debugerInfo + "\";", 100);
      } catch (evt) {throw new Error("Błąd debugera Runtime Agent - " + evt);}
    },
  // ---------------------
  // -OPERACJE NA COOKIES-
  // ---------------------
  // Odczyt cookies - RA_ScriptsSettings
    ReadSettingsCookie : function() {
      eval('var reg = /'+"RA_ScriptsSettings"+'=(.*?)(?:;|$)/;');
	  	var value = document.cookie.match(reg);
		  if (value) {
		    this.OutputToConsole("Runtime Agent Core - odczytano cookies ustawień, pobrano ustawienia");
  			var ret;
	  		switch (unescape(value[1])) {
		  		case 'true':
			  		ret = true;
				  	break;
	  			case 'false':
		  			ret = false;
			  		break;
  				default:
	  				ret = unescape(value[1]);
			  }
			  return ret;
		  } else {
		    this.OutputToConsole("Runtime Agent Core - odczytano cookies ustawień, jest ono puste");
        return false;
      }
    },
  // Zapis cookies - RA_ScriptsSettings
    SaveSettingsCookie : function(savestring) {
      var today = new Date();
      var expire = new Date();
      var nDays = 365;
      if (nDays==null || nDays==0) nDays=365;
      expire.setTime(today.getTime() + 3600000*24*nDays);
      document.cookie = "RA_ScriptsSettings"+"="+escape(savestring) + ";expires="+expire.toGMTString();
    },
  // Utworzenie obiektu przechowowania lokalnego dla danych roboczych
    InitializeCaptureObject : function() {
      this.CaptureObject = DS_userScript_SWFStore.initialize({
        SWFAddress : 'http://plemiona-skrypty.googlecode.com/svn/testowe/DS_userScriptSWFStore/flashStorage.swf',
        storageName : "PLEMIONA_RA2X",
        logger : PlemionaRuntimeAgent.OutputToConsole,
      });
    },
  // Odczyt pliku danych - RA_CapturedData
    ReadCaptureCookie : function() {
      var value = this.CaptureObject.getValue("RA_CapturedData");
      return ((value) ? value : false);
    },
  // Zapis pliku danych - RA_CapturedData
    SaveCaptureCookie : function(savestring) {
      if (this.CaptureObject.setValue("RA_CapturedData", savestring)) {
        return true;
      } else {
        return false;
      }
    },
  // Odczyt cookies - RA_Temporary
    ReadTempCookie : function() {
      var value = this.CaptureObject.getValue("RA_Temporary");
      return ((value) ? value : false);
    },
  // Zapis cookies - RA_Temporary
    SaveTempCookie : function(savestring) {
      if (this.CaptureObject.setValue("RA_Temporary", savestring)) {
        return true;
      } else {
        return false;
      }
    },
  // Pobieranie klas elementów
    getElementsByClass : function(searchClass,node,tag) {
      var classElements = new Array();
      if ( node == null )
       node = document;
      if ( tag == null )
       tag = '*';
      this.OutputToConsole("Runtime Agent Core - przetwarzanie żądania klasy obiektu " + searchClass + " w " + (((typeof node.nodeName) != "undefined") ? node.nodeName : node.toString()));
      var els = node.getElementsByTagName(tag);
      var elsLen = els.length;
      var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
      for (i = 0, j = 0; i < elsLen; i++) {
       if ( pattern.test(els[i].className) ) {
        classElements[j] = els[i];
        j++;
       }
      }
      return classElements;
    },
  // ---------------------
  // -ZMIENNE PRYWATNE   -
  // ---------------------
    FrameworkVersion : "3.0 final",
    IsDeveloperDistrib : true,
    ActiveInfo : window.setInterval("if ((typeof $) != \"undefined\") {try {clearInterval(PlemionaRuntimeAgent.ActiveInfo); $('.server_info')[1].innerHTML += '<br><span style=\"color: #6DE377\">Plemiona Runtime Agent w wersji <b>' + PlemionaRuntimeAgent.FrameworkVersion + '</b> załadowany.' + ((PlemionaRuntimeAgent.IsDeveloperDistrib === true) ? '<br>Wersja deweloperska (redystrybucyjna). <a href=\"javascript:PlemionaRuntimeAgent.ShowDebuger()\">Pokaż debuger</a></span>' : '</font>');} catch (evt) {};}", 1000),
  // ---------------------
  // -PARSERY INFORMACJI -
  // ---------------------
  // Parsowanie odczytowe surowego cookies na ustawienia skryptów
    ParseSettingsCookie : function(rawstring) {
      if (rawstring) {
        var stringarray = rawstring.split("/");
        this.OutputToConsole("Runtime Agent Core - sparsowano plik ustawień skrpytów do odczytu");
        return stringarray;
      } else {
        return false;
      }
    },
  // Parsowanie odczytowe surowego cookies na zebrane dane
    ParseCaptureCookie : function(rawstring) {
      if (rawstring) {
        var stringarray = rawstring.split("/");
        this.OutputToConsole("Runtime Agent Core - sparsowano plik zebranych danych do odczytu");
        return stringarray;
      } else {
        return false;
      }
    },
  // Parsowanie odczytowe surowego cookies na tymczasówki
    ParseTempCookie : function(rawstring) {
      if (rawstring) {
        var stringarray = rawstring.split("/");
        this.OutputToConsole("Runtime Agent Core - sparsowano plik danych tymczasowych do odczytu");
        return stringarray;
      } else {
        return false;
      }
    },
  // Odczyt informacji o identyfikatorze wioski
    getVillageId : function() {
      if ((typeof game_data) != "object") {
        return document.URL.match(/village=(\d+)/)[1];
      } else {
        return window.game_data.village.id;
      }
    },
  // Odczyt informacji o posiadanym Koncie Premium
    KPDetect : function() {
      this.OutputToConsole("Runtime Agent Core - detekcja Konta Premium zakończona, " + ((window.game_data.player.premium) ? "konto wykryto" : "konta nie wykryto"));
      return window.game_data.player.premium;
    },
  // ---------------------
  // -PARSERY ZAPISYWANIA-
  // ---------------------
  // Parsowanie zapisowe ustawień skryptów
    ParseSavableSettingsCookie : function(commid, set1, set2, set3, set4, set5, set6, set7, set8) {
      var currentcookie = this.ReadSettingsCookie();
      var currentarray = this.ParseSettingsCookie(currentcookie);
      position = -1;
      for (a = 0; a < currentarray.length; a++) {
        var commitcid = currentarray[a].split("=")[0];
        if (commitcid == commid) {position = a;}
      }
      if (position == -1) {
        currentcookie = currentcookie + "/" + commid + "=" + set1 + "," + set2 + "," + set3 + "," + set4 + "," + set5 + "," + set6 + "," + set7 + "," + set8;
        this.OutputToConsole("Runtime Agent Core - parsowanie zapisowe ustawień, tworzenie nowego klucza dla skryptu " + commid);
        this.SaveSettingsCookie(currentcookie);
      } else {
        currentarray[position] = commid + "=" + set1 + "," + set2 + "," + set3 + "," + set4 + "," + set5 + "," + set6 + "," + set7 + "," + set8;
        currentcookie = currentarray.join("/");
        this.OutputToConsole("Runtime Agent Core - parsowanie zapisowe ustawień, modyfikacja istniejącego klucza dla skryptu " + commid);
        this.SaveSettingsCookie(currentcookie);
      }
    },
  // Parsowanie zapisowe strumienia danych
    ParseSavableCaptureCookie : function(villageid, poparcie, procent_zagrody, isoff, isdeff, groups, timestamp) {
      var currentcookie = this.ReadCaptureCookie();
      var currentarray = this.ParseCaptureCookie(currentcookie);
      position = -1;
      var czy_wojsko = (isoff == true ? "1" : "0") + (isdeff == true ? "1" : "0");
      for (a = 0; a < currentarray.length; a++) {
        var villagecid = currentarray[a].split("=")[0];
        if (villagecid == villageid) {position = a;}
      }
      if (position == -1) {
        currentcookie = currentcookie + "/" + villageid + "=" + poparcie + "," + procent_zagrody + "," + czy_wojsko + "," + groups + "," + timestamp;
        this.OutputToConsole("Runtime Agent Core - parsowanie zapisowe ustawień, tworzenie nowego klucza dla wioski " + villageid);
        this.SaveCaptureCookie(currentcookie);
      } else {
        currentarray[position] = villageid + "=" + poparcie + "," + procent_zagrody + "," + czy_wojsko + "," + groups + "," + timestamp;
        currentcookie = currentarray.join("/");
        if (currentcookie.length > 50000) {
          currentarray[0] = null;
          currentarray[1] = null;
          currentcookie = currentarray.join("/");
          this.OutputToConsole("Runtime Agent Core - parsowanie zapisowe danych wioski, plik okazuje się być za duży, wycinam najstarsze dane");
        }
        this.OutputToConsole("Runtime Agent Core - parsowanie zapisowe danych wioski, modyfikacja istniejącego klucza dla wioski " + villageid);
        this.SaveCaptureCookie(currentcookie);
      }
    },
  // Parsowanie zapisowe tymczasowych danych
    ParseSavableTempCookie : function(vartype, content1, content2, content3) {
      var currentcookie = this.ReadTempCookie();
      if (currentcookie) {
        var currentarray = this.ParseTempCookie(currentcookie);
      } else {
        var currentarray = new Array();
      }
      position = -1;
      var is_general = (vartype == "general" ? true : false);
      if (is_general == false) {
        var a = parseInt(vartype);
      }
      if (is_general == true) {
        currentarray[0] = "GENERAL" + "=" + content1 + "," + content2;
        currentcookie = currentarray.join("/");
        this.OutputToConsole("Runtime Agent Core - parsowanie zapisowe danych tymczasowych, zapis wartości generalnych");
        this.SaveTempCookie(currentcookie);
      } else {
        currentarray[a] = "SCRIPT" + vartype + "=" + content1 + "," + content2 + "," + content3;
        currentcookie = currentarray.join("/");
        if (currentcookie.length > 8000) {
          this.OutputToConsole("Runtime Agent Core - parsowanie zapisowe danych tymczasowych, plik okazuje się być za duży, wyloguj się i zaloguj ponownie");
          return false;
        }
        this.OutputToConsole("Runtime Agent Core - parsowanie zapisowe danych tymczasowych, zapis klucza tymczasowego dla sekwencji " + vartype);
        this.SaveTempCookie(currentcookie);
      }
    },
  // ---------------------
  // -SPOSOBY ZAPISU     -
  // ---------------------
  // Ustawienia skryptów:
  // Każdy skrypt ma swój commid (4 znaki), który nie może się powtórzyć.
  // commid1=set1,set2,set3,set4,set5,set6,set7,set8/commid2=set1,set2,set3,set4,set5,set6,set7,set8/commid3=....
  //
  // Zbierane dane:
  // Elementy są po kolei oznaczane.
  // villageid=poparcie,procent_zagrody,czy_wojsko,grupa1.grupa2,data_sprawdzania/villageid=poparcie,procent_zagrody,czy_wojsko,....
  // poparcie - liczba trzycyfrowa.
  // procent_zagrody - liczba trzycyfrowa.
  // czy_wojsko - dwie cyfry; pierwsza (0/1) = off, druga (0/1) = deff
  // grupa1/2 - nazwy grup
  // data_sprawdzenia - znacznik czasu VPE
  //
  // Wartości tymczasowe:
  // Wartości h= i secret oraz inne dane przechowywane przez różne skrypty (pamięć RAM skryptów).
  // GENERAL=h,secret/SCRIPT1=data1,data2,data3/SCRIPT2=data1,data2,data3/SCRIPT3=....
  //
  // ---------------------
  // -FUNKCJE CZYTNIKA   -
  // ---------------------
  // Uzyskiwanie danych z przeglądu wioski - poparcie i datownik
    getLoyaltyFromOV : function() {
      try {
			var villageId = this.getVillageId();
			var scanTime = ~~(~~(~~(new Date().getTime()/1000)/60)/60);
			var loyalty = (($('#show_mood div.vis_item span').length > 0) ? ~~($('#show_mood div.vis_item span')[0].innerHTML.replace(/<.+?>/gi, '')) : 100);
			retinfo = new Array();
			retinfo[1] = loyalty;
			retinfo[2] = scanTime;
			this.OutputToConsole("Przechwytywanie danych wiosek - pierwsza procedura dla wioski " + villageId + " dała wyniki: " + retinfo.toString());
			return retinfo;
		  } catch (e) {this.OutputToConsole("Przechwytywanie danych wiosek - znaleziono błąd funkcji: " + e);}
    },
  // Uzyskiwanie danych z przeglądu wioski - zawartość offa/deffa, procent zagrody i grupy
    getConstansFromOV : function() {
    try {
      var retinfo = new Array();
      var KP = this.KPDetect();
      
      // tu to, co mamy już załatwione....
      var zagroda_proc = ~~($('#pop_current_label')[0].innerHTML.replace(/<.+?>/gi, '')) / ~~($('#pop_max_label')[0].innerHTML.replace(/<.+?>/gi, '')) * 100;
      var army_data = (($('#show_units div').length > 0) ? $('#show_units div')[0].innerHTML.replace(/<.+?>/gi, '') : false);
      
      // zostało nam sprawdzić grupy przy KP, ale to jutro....
      var groups_container = (((KP === true) && ($('#group_table').length > 0)) ? $('#group_table')[0] : false); 
      
      if (groups_container != false) {
        groups = groups_container.getElementsByTagName("td");
        groupsd = new Array();
        for (d = 0; d < groups.length; d++) {
          groupsd[d] = groups[d].innerHTML.replace(/<.+?>/gi, "");
        }
      }
      retinfo = new Array();
      retinfo[1] = zagroda_proc.toString().match(/(\d{1,3})\.\d+/)[1];
      if (army_data != false) {
        retinfo[2] = (((army_data.match(/Toporn/)) || (army_data.match(/Zwiad/)) || (army_data.match(/kawalerz/)) || (army_data.match(/Taran/)) || (army_data.match(/Szlachc/))) ? "1" : "0") + (((army_data.match(/Pikin/)) || (army_data.match(/Miecz/)) || (army_data.match(/Łuczn/)) || (army_data.match(/knight.png/))) ? "1" : "0");
      } else {
        retinfo[2] = "00";
      }
      retinfo[3] = (((groups_container != false) || (groupsd.length > 0)) ? escape(groupsd.join(".")) : "Brak%20KP");
      this.OutputToConsole("Przechwytywanie danych wiosek - druga procedura dla wioski " + this.getVillageId() + " dała wyniki: " + retinfo.toString());
      return retinfo;
    } catch (e) {this.OutputToConsole("Przechwytywanie danych wiosek - błąd procedury: " + e)};
    },
  // Pobieranie informacji z przeglądu wioski - częć wykonawczo-zapisująca.
    getInfoFromOverview : function() {
      var villageid = this.getVillageId();
      var poparcie = this.getLoyaltyFromOV()[1];
      var procent_zagrody = this.getConstansFromOV()[1];
      var czy_wojsko = this.getConstansFromOV()[2];
      var grupy = this.getConstansFromOV()[3];
      var timestamp = this.getLoyaltyFromOV()[2];
//      alert(villageid + ", " + poparcie + ", " + procent_zagrody + ", " + czy_wojsko.substr(0,1) + ", " + czy_wojsko.substr(1,2) + ", " + grupy + ", " + timestamp)
      this.ParseSavableCaptureCookie(villageid, poparcie, procent_zagrody, ((czy_wojsko.substr(0,1) == "1") ? true : false), ((czy_wojsko.substr(1,2) == "1") ? true : false), grupy, timestamp);
    },
  // Pobranie identyfikatorów charakterystycznych dla sesji.
    loadTemporaryIdentifiers : function() {
      var hid = window.game_data.csrf;
	  	var secret = window.game_data.player.id;
	  	this.OutputToConsole("Przechwytywanie identyfikatorów - identyfikator H: " + hid + ", identyfikator Secret: " + secret);
	  	this.ParseSavableTempCookie("general", hid, secret);
    },
  // Odczyt ustawień skryptu według commid'u.
    getScriptsSettings : function(commid) {
      var currentcookie = this.ReadSettingsCookie();
      if (currentcookie == false) {return false;}
      var currentarray = this.ParseSettingsCookie(currentcookie);
      var reg = new RegExp(commid + "=(.+?),(.+?),(.+?),(.+?),(.+?),(.+?),(.+?),([^/]+)(?=\/?)", "i");
      settingsa = currentcookie.match(reg);
      settingsa[0] = commid;
      this.OutputToConsole("Runtime Agent Exporter - skrypt o commid'zie " + commid + " zażądał ustawień, przekazano");
      return settingsa;
    },
  // Odczyt danych tymczasowych....
    getTemporaryData : function(vartype) {
      var currentcookie = this.ReadTempCookie();
      var currentarray = this.ParseTempCookie(currentcookie);
      if (vartype == "hid") {
        return currentcookie.match(/GENERAL=(.{4}),/i)[1];
      } else if (vartype == "secret") {
        return currentcookie.match(/GENERAL=.{4},(.+?)[/]/)[1];
      } else {
        var reg = new RegExp("SCRIPT" + vartype + "=(.+?),(.+?),([^/]+)(?=\/?)", "i");
        this.OutputToConsole("Runtime Agent Exporter - skrypt zażądał danych tymczasowych spod bloku " + vartype);
        return currentcookie.match(reg);
      }
    },
  // ---------------------
  // -FUNKCJE DODATKOWE  -
  // ---------------------
  // Timer czasu zalogowania (według skryptu Lukasza032)
    LoginTimer : function() {
      // Odczyt aktualnej wartości czasu aktywności (jeśli zalogowany)
      if (document.cookie.match(/last_react_time=/)) {
        visit_time = parseInt(document.cookie.match(/last_react_time=(\d+)/)[1]);
        this.OutputToConsole("Internal Login Timer - odczytano czas zalogowania, wynosi on " + visit_time + " sekund");
      } else {
        visit_time = 0;
        this.OutputToConsole("Internal Login Timer - stworzono czas zalogowania, wynosi on " + visit_time + " sekund");
      }
      // Kod ładujący zwiększacz liczby do pamięci przeglądarki
      dstimer_process = setInterval("visit_time = visit_time + 1;", 1000);
      this.OutputToConsole("Internal Login Timer - zwiększacz liczby załadowany, jego PID to " + dstimer_process);
      // Podawanie czasu do linków ładujących podstrony
      var links = document.getElementsByTagName("a");
      var areas = document.getElementsByTagName("area");
      for (a = 0; a < links.length; a++) {
        try {
          if (links[a].getAttribute("href").match(/game.php/)) {
            links[a].setAttribute("onclick", "document.cookie='last_react_time='+visit_time;");
          }
        } catch (evt) {this.OutputToConsole("Internal Login Timer - błąd podczas modyfikacji linków link: " + evt);};
      }
      for (a = 0; a < areas.length; a++) {
        try {
          if (areas[a].getAttribute("href").match(/game.php/)) {
            areas[a].setAttribute("onclick", "document.cookie='last_react_time='+visit_time;");
          }
        } catch (evt) {this.OutputToConsole("Internal Login Timer - błąd podczas modyfikacji linków area: " + evt);};
      }
      // Informacja o czasie ostatniej reakcji na dole strony
      dstimer_show = setInterval("if ((typeof $) != \"undefined\") {try {clearInterval(dstimer_show);$('.server_info')[1].innerHTML += '<br><span style=\"color: #A67A42\">Od zalogowania do ostatniej akcji upłynęło <b>' + visit_time + '</b> sekund.</span>';} catch (evt) {};}", 600);
    },
  // Eksport informacji z RA do VPE (technology by Nexces)
    ExportToVPE : function(informations) {
      vlgout = "";
      this.OutputToConsole("Runtime Agent Exporter - eksport " + informations.length + " linii bieżących ustawień do formatu VPE");
      for (a = 0; a < informations.length; a++) {
        villageinfo = informations[a].split("=");
        villaged = new Array();
        villaged[1] = villageinfo[0];
        villaged[2] = villageinfo[1].split(",")[4];
        villaged[3] = villageinfo[1].split(",")[0];
        vlgout = vlgout + villaged[1] + "," + villaged[2] + "," + villaged[3] + "|";
      }
      return escape(vlgout);
    },
  // Notyfikacja o aktualizacjach framework'a - moduł sprawdzający.
    UpdateNotifierDownload : function() {
      var notifier = document.createElement("script");
      notifier.setAttribute("type", "text/javascript");
      notifier.setAttribute("src", "http://www.lukasz032_s1.prophp.org/plemiona_skrypty/ragent_version.js?time="+~~(new Date().getTime() / 1000000).toString());
      this.OutputToConsole("Runtime Agent Update Notifier - sprawdzenie wersji skryptu z aktualną dostępną na serwerach");
      document.body.appendChild(notifier);
    },
  // Notyfikacja o aktualizacjach framework'a - moduł wykonawczy.
    UpdateNotifier : function() {
      if (this.getTemporaryData("1") == null) {
        this.ParseSavableTempCookie("1", "0", "0", "0");
      }
      var status = ((this.getTemporaryData("1")[1] == "1") ? "done" : "pending");
      var choice = ((this.getTemporaryData("1")[2] == "2") ? "rejected" : "other");
      if ((status != "done") && (choice != "rejected")) {
        if ((typeof this.FrameworkNewVersion) == "string") {
          this.ParseSavableTempCookie("1", "1", "0", "0");
        } else {
          this.OutputToConsole("Runtime Agent Update Notifier - sprawdzenie nie zostało dokonane, uruchamiam");
          this.UpdateNotifierDownload();
          window.setTimeout("PlemionaRuntimeAgent.UpdateNotifier()", 2000);
          return false;
        }
      }
      if (choice != "rejected") {
        if ((this.FrameworkNewVersion) && (this.FrameworkVersion === this.FrameworkNewVersion)) {
          this.OutputToConsole("Runtime Agent Update Notifier - posiadana wersja jest aktualna, kończę zadanie");
          return true;
        } else if (this.FrameworkNewVersion) {
          this.OutputToConsole("Runtime Agent Update Notifier - posiadana wersja różni się od aktualnej, wyświetlam przypomnienie");
          if (confirm("Posiadasz wersję \"" + this.FrameworkVersion + "\" Runtime Agenta. \r\nNajnowsza dostępna wersja to: \"" + this.FrameworkNewVersion + "\". \r\nCzy chcesz dokonać aktualizacji?") == true) {
            this.ParseSavableTempCookie("1", this.getTemporaryData("1")[1], "1", "0");
            this.OutputToConsole("Runtime Agent Update Notifier - kieruję użytkownika na stronę z aktualizacją skryptu");
            window.top.location = "http://code.google.com/p/plemiona-skrypty/wiki/runtime_agent";
          } else {
            this.OutputToConsole("Runtime Agent Update Notifier - aktualizacja anulowana, zapisuję decyzję użytkownika");
            this.ParseSavableTempCookie("1", this.getTemporaryData("1")[1], "2", "0");
          }
        }
      } else {
        this.OutputToConsole("Runtime Agent Update Notifier - aktualizacja w tej sesji została anulowana, kończę zadanie");
      }
    },
  // Renderowanie stron ustawień skryptów.
  // Zastosowane parametry: 
  // 1) Commid - rezerwowany przy tworzeniu skryptu.
  // 2) Tablica "config":
  //  |- 0:  Liczba dostępnych opcji dla skryptu
  //  |- 1:  Typ siódmej opcji konfiguracyjnej (obsługiwane: "checkbox", "choice", "textbox")
  //  |- 2:  Typ ósmej opcji konfiguracyjnej (obsługiwane: "checkbox", "choice", "textbox")
  //  |- 3:  Liczba wyborów dla siódmej opcji, jeśli jest ona ustawiona na choice
  //  |- 4:  Liczba wyborów dla ósmej opcji, jeśli jest ona ustawiona na choice
  //  |- 5:  Adres strony (ścieżka bezwzględna), na który należy usera przekierować po konfiguracji.
  // 3) Tablica "langpack":
  //  |- 0:  Nazwa skryptu
  //  |- 1:  Autor skryptu
  //  |- 2:  Wersja skryptu
  //  |- 3:  Opis pierwszego nagłówka (zawierającego przycisk włączenia)
  //  |- 4:  Opis drugiego nagłówka (zawierającego ustawienia monostabine)
  //  |- 5:  Opis trzeciego nagłówka (od ustawień dostosowywalnych)
  //  |- 6:  Opis pierwszej opcji (tej włączającej cały skrypt)
  //  |- 7:  Opis drugiej opcji (monostabilnej)
  //  |- 8:  Opis trzeciej opcji (monostabilnej)
  //  |- 9:  Opis czwartej opcji (monostabilnej)
  //  |- 10: Opis piątej opcji (monostabilnej)
  //  |- 11: Opis szóstej opcji (monostabilnej)
  //  |- 12: Opis siódmej opcji (konfigurowalnej)
  //  |- 13: Opis ósmej opcji (konfigurowalnej)
  //  |- 14: Siódma opcja, pierwszy wybór (dla pól wyboru)
  //  |- 15: Siódma opcja, drugi wybór (dla pól wyboru)
  //  |- 16: Siódma opcja, trzeci wybór (dla pól wyboru)
  //  |- 17: Siódma opcja, czwarty wybór (dla pól wyboru)
  //  |- 18: Siódma opcja, piąty wybór (dla pól wyboru)
  //  |- 19: Siódma opcja, szósty wybór (dla pól wyboru)
  //  |- 20: Siódma opcja, siódmy wybór (dla pól wyboru)
  //  |- 21: Siódma opcja, ósmy wybór (dla pól wyboru)
  //  |- 22: Ósma opcja, pierwszy wybór (dla pól wyboru)
  //  |- 23: Ósma opcja, drugi wybór (dla pól wyboru)
  //  |- 24: Ósma opcja, trzeci wybór (dla pól wyboru)
  //  |- 25: Ósma opcja, czwarty wybór (dla pól wyboru)
  //  |- 26: Ósma opcja, piąty wybór (dla pól wyboru)
  //  |- 27: Ósma opcja, szósty wybór (dla pól wyboru)
  //  |- 28: Ósma opcja, siódmy wybór (dla pól wyboru)
  //  |- 29: Ósma opcja, ósmy wybór (dla pól wyboru)
  //  |- 30: Tekst znajdujący się pod przyciskiem zapisu
  // Wszystkie opcje są wymagane. Wszystkie też powinny mieć postać stringów.
    RenderSettingsPage : function(commid, config, langpack) {
      if (document.forms[0]) {
        var container = document.forms[0].parentNode;
        container.innerHTML = '';
      }
      if ((typeof container) == "undefined") {
        this.OutputToConsole("Generator stron ustawień skryptów - nie znalazłem rubryki do podmiany, koniec pracy");
        return false;
      }
      container.style.width = '85%';
      var oldSettings = this.getScriptsSettings(commid);
      if (oldSettings[1] == "1") {
			  var set1c = 'checked="checked"';
			} else {
        var set1c = '';
      }
      if (oldSettings[2] == "1") {
			  var set2c = 'checked="checked"';
			} else {
        var set2c = '';
      }
      if (oldSettings[3] == "1") {
			  var set3c = 'checked="checked"';
			} else {
        var set3c = '';
      }
      if (oldSettings[4] == "1") {
			  var set4c = 'checked="checked"';
			} else {
        var set4c = '';
      }
			if (oldSettings[5] == "1") {
			  var set5c = 'checked="checked"';
			} else {
        var set5c = '';
      }
			if (oldSettings[6] == "1") {
			  var set6c = 'checked="checked"';
			} else {
        var set6c = '';
      }
			if ((config[1] == "checkbox") && (oldSettings[7] == "1")) {
			  var set7c = 'checked="checked"';
			  var set7o1 = '';
        var set7o2 = '';
        var set7o3 = '';
        var set7o4 = '';
        var set7o5 = '';
        var set7o6 = '';
        var set7o7 = '';
        var set7o8 = '';
			} else if (config[1] == "checkbox") {
        var set7c = '';
        var set7o1 = '';
        var set7o2 = '';
        var set7o3 = '';
        var set7o4 = '';
        var set7o5 = '';
        var set7o6 = '';
        var set7o7 = '';
        var set7o8 = '';
      } else if (config[1] == "choice") {
        var set7c = '';
        var set7o1 = (((oldSettings[7] == "o1") || ((typeof oldSettings[7]) == "undefined")) ? 'checked="checked"' : '');
        var set7o2 = ((oldSettings[7] == "o2") ? 'checked="checked"' : '');
        var set7o3 = ((oldSettings[7] == "o3") ? 'checked="checked"' : '');
        var set7o4 = ((oldSettings[7] == "o4") ? 'checked="checked"' : '');
        var set7o5 = ((oldSettings[7] == "o5") ? 'checked="checked"' : '');
        var set7o6 = ((oldSettings[7] == "o6") ? 'checked="checked"' : '');
        var set7o7 = ((oldSettings[7] == "o7") ? 'checked="checked"' : '');
        var set7o8 = ((oldSettings[7] == "o8") ? 'checked="checked"' : '');
      } else if (config[1] == "textbox") {
        var set7c = oldSettings[7];
        var set7o1 = '';
        var set7o2 = '';
        var set7o3 = '';
        var set7o4 = '';
        var set7o5 = '';
        var set7o6 = '';
        var set7o7 = '';
        var set7o8 = '';
      }
			if ((config[2] == "checkbox") && (oldSettings[8] == "1")) {
			  var set8c = 'checked="checked"';
			  var set8o1 = '';
        var set8o2 = '';
        var set8o3 = '';
        var set8o4 = '';
        var set8o5 = '';
        var set8o6 = '';
        var set8o7 = '';
        var set8o8 = '';
			} else if (config[2] == "checkbox") {
        var set8c = '';
        var set8o1 = '';
        var set8o2 = '';
        var set8o3 = '';
        var set8o4 = '';
        var set8o5 = '';
        var set8o6 = '';
        var set8o7 = '';
        var set8o8 = '';
      } else if (config[2] == "choice") {
        var set8c = '';
        var set8o1 = (((oldSettings[8] == "o1") || ((typeof oldSettings[8]) == "undefined")) ? 'checked="checked"' : '');
        var set8o2 = ((oldSettings[8] == "o2") ? 'checked="checked"' : '');
        var set8o3 = ((oldSettings[8] == "o3") ? 'checked="checked"' : '');
        var set8o4 = ((oldSettings[8] == "o4") ? 'checked="checked"' : '');
        var set8o5 = ((oldSettings[8] == "o5") ? 'checked="checked"' : '');
        var set8o6 = ((oldSettings[8] == "o6") ? 'checked="checked"' : '');
        var set8o7 = ((oldSettings[8] == "o7") ? 'checked="checked"' : '');
        var set8o8 = ((oldSettings[8] == "o8") ? 'checked="checked"' : '');
      } else if (config[2] == "textbox") {
        var set8c = oldSettings[8];
        var set8o1 = '';
        var set8o2 = '';
        var set8o3 = '';
        var set8o4 = '';
        var set8o5 = '';
        var set8o6 = '';
        var set8o7 = '';
        var set8o8 = '';
      }
      this.OutputToConsole("Generator stron ustawień skryptów - zakończono wczytywanie dotychczasowych ustawień do formularza");
      switch (config[1]) {
        case "choice":
          var opcja7data = '<td> \
                        <input type="radio" id="RAForm_Opt7o1" name="RuntimeAgentForm_s7" value="o1" solidvalue="1" ' + set7o1 + '/><label for="RAForm_Opt7o1">' + langpack[14] + '</label><br> \
                        <input type="radio" id="RAForm_Opt7o2" name="RuntimeAgentForm_s7" value="o2" solidvalue="2" ' + set7o2 + '/><label for="RAForm_Opt7o2">' + langpack[15] + '</label><br> \
                        <input type="radio" id="RAForm_Opt7o3" name="RuntimeAgentForm_s7" value="o3" solidvalue="3" ' + set7o3 + '/><label for="RAForm_Opt7o3">' + langpack[16] + '</label><br> \
                        <input type="radio" id="RAForm_Opt7o4" name="RuntimeAgentForm_s7" value="o4" solidvalue="4" ' + set7o4 + '/><label for="RAForm_Opt7o4">' + langpack[17] + '</label><br> \
                        <input type="radio" id="RAForm_Opt7o5" name="RuntimeAgentForm_s7" value="o5" solidvalue="5" ' + set7o5 + '/><label for="RAForm_Opt7o5">' + langpack[18] + '</label><br> \
                        <input type="radio" id="RAForm_Opt7o6" name="RuntimeAgentForm_s7" value="o6" solidvalue="6" ' + set7o6 + '/><label for="RAForm_Opt7o6">' + langpack[19] + '</label><br> \
                        <input type="radio" id="RAForm_Opt7o7" name="RuntimeAgentForm_s7" value="o7" solidvalue="7" ' + set7o7 + '/><label for="RAForm_Opt7o7">' + langpack[20] + '</label><br> \
                        <input type="radio" id="RAForm_Opt7o8" name="RuntimeAgentForm_s7" value="o8" solidvalue="8" ' + set7o8 + '/><label for="RAForm_Opt7o8">' + langpack[21] + '</label> \
                        </td>';
          this.OutputToConsole("Generator stron ustawień skryptów - opcja siódma menu ustawiona jako lista wyboru");
          break;
        case "checkbox":
          var opcja7data = '<td><input type="checkbox" id="RAForm_Opt7" name="RuntimeAgentForm_s7" value="1" ' + set7c + '/></td>';
          this.OutputToConsole("Generator stron ustawień skryptów - opcja siódma menu ustawiona jako pole zaznaczenia");
          break;
        case "textbox":
          if ((typeof set7c) == "undefined") {var set7c = "";}
          var opcja7data = '<td><input type="text" id="RAForm_Opt7" name="RuntimeAgentForm_s7" value="' + set7c + '"/></td>';
          this.OutputToConsole("Generator stron ustawień skryptów - opcja siódma menu ustawiona jako pole tekstowe");
          break;
        default:
          this.OutputToConsole('Generator stron ustawień skryptów - błędne dane podane do funkcji wywołującej stronę, przerywam');
          return false;
      }
      switch (config[2]) {
        case "choice":
          var opcja8data = '<td> \
                        <input type="radio" id="RAForm_Opt8o1" name="RuntimeAgentForm_s8" value="o1" solidvalue="1" ' + set8o1 + '/><label for="RAForm_Opt8o1">' + langpack[22] + '</label><br> \
                        <input type="radio" id="RAForm_Opt8o2" name="RuntimeAgentForm_s8" value="o2" solidvalue="2" ' + set8o2 + '/><label for="RAForm_Opt8o2">' + langpack[23] + '</label><br> \
                        <input type="radio" id="RAForm_Opt8o3" name="RuntimeAgentForm_s8" value="o3" solidvalue="3" ' + set8o3 + '/><label for="RAForm_Opt8o3">' + langpack[24] + '</label><br> \
                        <input type="radio" id="RAForm_Opt8o4" name="RuntimeAgentForm_s8" value="o4" solidvalue="4" ' + set8o4 + '/><label for="RAForm_Opt8o4">' + langpack[25] + '</label><br> \
                        <input type="radio" id="RAForm_Opt8o5" name="RuntimeAgentForm_s8" value="o5" solidvalue="5" ' + set8o5 + '/><label for="RAForm_Opt8o5">' + langpack[26] + '</label><br> \
                        <input type="radio" id="RAForm_Opt8o6" name="RuntimeAgentForm_s8" value="o6" solidvalue="6" ' + set8o6 + '/><label for="RAForm_Opt8o6">' + langpack[27] + '</label><br> \
                        <input type="radio" id="RAForm_Opt8o7" name="RuntimeAgentForm_s8" value="o7" solidvalue="7" ' + set8o7 + '/><label for="RAForm_Opt8o7">' + langpack[28] + '</label><br> \
                        <input type="radio" id="RAForm_Opt8o8" name="RuntimeAgentForm_s8" value="o8" solidvalue="8" ' + set8o8 + '/><label for="RAForm_Opt8o8">' + langpack[29] + '</label> \
                        </td>';
          this.OutputToConsole("Generator stron ustawień skryptów - opcja ósma menu ustawiona jako lista wyboru");
          break;
        case "checkbox":
          var opcja8data = '<td><input type="checkbox" id="RAForm_Opt8" name="RuntimeAgentForm_s8" value="1" ' + set8c + '/></td>';
          this.OutputToConsole("Generator stron ustawień skryptów - opcja ósma menu ustawiona jako pole zaznaczania");
          break;
        case "textbox":
          if ((typeof set8c) == "undefined") {var set8c = "";}
          var opcja8data = '<td><input type="text" id="RAForm_Opt8" name="RuntimeAgentForm_s8" value="' + set8c + '"/></td>';
          this.OutputToConsole("Generator stron ustawień skryptów - opcja ósma menu ustawiona jako pole tekstowe");
          break;
        default:
          this.OutputToConsole('Generator stron ustawień skryptów - błędne dane podane do funkcji wywołującej stronę, przerywam');
          return false;
      }
			var settingsForm = ' \
				<h3><i>' + langpack[0] + '</i> - Ustawienia</h3> \
				<p align="left"><font color="#6DE377"><i>by <b>' + langpack[1] + '</b></i> &#166; Wersja skryptu: <b>' + langpack[2] + '</b> &#166; <i>Menu ustawień by <b>Lukasz032</b></i></font></p> \
				<form name="RuntimeAgentForm_s" onsubmit=\'return PlemionaRuntimeAgent.ParseSettingsPage("' + commid + '", "' + config[5] + '")\' action="/game.php?screen=settings&amp;mode=settings"> \
					<table class="vis" width="100%"> \
						<tr><th colspan="2">' + langpack[3] + '</th></tr> \
						<tr> \
							<td style="width: 70%"><label for="RAForm_Opt1">' + langpack[6] + '</label></td> \
							<td> \
               <input type="checkbox" id="RAForm_Opt1" name="RuntimeAgentForm_s1" value="1" ' + set1c + '/> \
              </td> \
						</tr>' + ((parseInt(config[0]) > 1) ? ' \
						<tr><td colspan="2" style="background-color: transparent">&nbsp;</td></tr> \
						<tr><th colspan="2">' + langpack[4] + '</th></tr> \
						<tr> \
							<td><label for="RAForm_Opt2">' + langpack[7] + '</label></td> \
							<td> \
               <input type="checkbox" id="RAForm_Opt2" name="RuntimeAgentForm_s2" value="1" ' + set2c + '/> \
              </td> \
						</tr>' + ((parseInt(config[0]) > 2) ? ' \
						<tr> \
							<td><label for="RAForm_Opt3">' + langpack[8] + '</label></td> \
							<td> \
               <input type="checkbox" id="RAForm_Opt3" name="RuntimeAgentForm_s3" value="1" ' + set3c + '/> \
              </td> \
						</tr>' + ((parseInt(config[0]) > 3) ? ' \
						<tr> \
							<td><label for="RAForm_Opt4">' + langpack[9] + '</label></td> \
							<td> \
               <input type="checkbox" id="RAForm_Opt4" name="RuntimeAgentForm_s4" value="1" ' + set4c + '/> \
              </td> \
						</tr>' + ((parseInt(config[0]) > 4) ? ' \
						<tr> \
							<td><label for="RAForm_Opt5">' + langpack[10] + '</label></td> \
							<td> \
               <input type="checkbox" id="RAForm_Opt5" name="RuntimeAgentForm_s5" value="1" ' + set5c + '/> \
              </td> \
						</tr>' + ((parseInt(config[0]) > 5) ? ' \
						<tr> \
							<td><label for="RAForm_Opt6">' + langpack[11] + '</label></td> \
							<td> \
               <input type="checkbox" id="RAForm_Opt6" name="RuntimeAgentForm_s6" value="1" ' + set6c + '/> \
              </td> \
						</tr>' + ((parseInt(config[0]) > 6) ? ' \
						<tr><td colspan="2" style="background-color: transparent">&nbsp;</td></tr> \
						<tr><th colspan="2">' + langpack[5] + '</th></tr> \
						<tr> \
							<td><span>' + langpack[12] + '</span></td> ' + opcja7data + '\
						</tr>' + ((parseInt(config[0]) == 8) ? ' \
						<tr> \
							<td><span>' + langpack[13] + '</span></td> ' + opcja8data + '\
						</tr>' : '') : '') : '') : '') : '') : '') : '') + ' \
						<tr><td colspan="2" style="background-color: transparent">&nbsp;</td></tr> \
						\
						<tr><td colspan="2" style="background-color: transparent"></td></tr> \
						<tr><td colspan="2"><input type="submit" value="Zapisz ustawienia" /></td></tr> \
						<tr><td colspan="2" style="background-color: transparent"</td></tr> \
						<tr><td colspan="2" style="width: 18cm"><em>&nbsp;' + langpack[30] + '<br><div align="right" style="font-size: 0.2cm">powered by Plemiona Runtime Agent ' + this.FrameworkVersion + '</div></em></td></tr> \
					</table> \
				</form> \
			';
			container.innerHTML = settingsForm;
			this.OutputToConsole("Generator stron ustawień skryptów - załadowano menu ustawień do aktualnego ekranu gry");
    },
    ParseSettingsPage : function(commid, redirect_page) {
      this.OutputToConsole('Generator stron ustawień skryptów - otrzymano ustawienia: ' + commid + ", " + redirect_page);
      var sForm = document.forms[0].elements;
      var pre_settings = new Array();
      for (var i=0; i<sForm.length; i++) {
        this.OutputToConsole('Generator stron ustawień skrpytów - sForm[' + i + '] = ' + sForm[i].name + ', ' + sForm[i].value + ', ' + sForm[i].checked);
        if (sForm[i].name != '') {
	        if (sForm[i].value == '') {
            sForm[i].value = false;
		      };
	  	    if (sForm[i].type == 'checkbox') {
	  		    sForm[i].value = ((sForm[i].checked) ? "1" : "0");
	  	    };
	  	    if (sForm[i].type == 'radio') {
            if (sForm[i].checked) {
              sForm[i].value = sForm[i].value;
            } else {
              sForm[i].name = null;
              sForm[i].value = null;
            }
          };
          if (sForm[i].name == "RuntimeAgentForm_s1") {
            var sett1 = sForm[i].value;
          };
          if (sForm[i].name == "RuntimeAgentForm_s2") {
            var sett2 = sForm[i].value;
          };
          if (sForm[i].name == "RuntimeAgentForm_s3") {
            var sett3 = sForm[i].value;
          };
          if (sForm[i].name == "RuntimeAgentForm_s4") {
            var sett4 = sForm[i].value;
          };
          if (sForm[i].name == "RuntimeAgentForm_s5") {
            var sett5 = sForm[i].value;
          };
          if (sForm[i].name == "RuntimeAgentForm_s6") {
            var sett6 = sForm[i].value;
          };
          if (sForm[i].name == "RuntimeAgentForm_s7") {
            var sett7 = sForm[i].value;
          };
          if (sForm[i].name == "RuntimeAgentForm_s8") {
            var sett8 = sForm[i].value;
          };
	      }
	    }
      this.OutputToConsole('Generator stron ustawień skryptów - sformułowano ustawienia: ' + commid + " = " + sett1 + ", " + sett2 + ", " + sett3 + ", " + sett4 + ", " + sett5 + ", " + sett6 + ", " + sett7 + ", " + sett8);
      try {
        this.ParseSavableSettingsCookie(commid, sett1, sett2, sett3, sett4, sett5, sett6, sett7, sett8);
        this.OutputToConsole('Generator stron ustawień skryptów - ustawienia skryptu \'' + commid + '\' zostały zapisane poprawnie, przekierowuję usera');
        alert("Ustawienia zapisane poprawnie. Możesz wrócić do gry.");
        window.location = redirect_page;
        return false;
      } catch (evt) {
        this.OutputToConsole('Generator stron ustawień skryptów - zapis ustawień skryptu "' + commid + '" został przerwany błędem krytycznym: ' + evt);
        alert("Wystąpił błąd podczas zapisu ustawień. Więcej szczegółów w debugerze Runtime Agenta.");
        return false;
      }
    },
  // Zapisywanie pojedyńczych ustawień skryptów.
    SetSingleSetting : function(commid, number, settingString) {
      // Zabezpieczenie przed CSS wskutek podaniem parametru innego niż liczba....
      if ((typeof number) == "string") {
        number = parseInt(number);
        this.OutputToConsole("Zapisywanie pojedyńczego ustawienia - błędne sformułowanie parametru number (jest ciągiem), konwertuję na liczbę");
      }
      var settings = this.getScriptsSettings(commid);
      settings[number] = (((typeof settingString) == "string") ? settingString : false);
      this.OutputToConsole("Zapisywanie pojedyńczego ustawienia - zapisano ustawienie o numerze " + number.toString() + " dla skryptu " + commid);
      return this.ParseSavableSettingsCookie(commid, settings[1], settings[2], settings[3], settings[4], settings[5], settings[6], settings[7], settings[8]);
    },
  // Odczytywanie pojedyńczych ustawień skryptów.
    DescendSingleSetting : function(commid, number) {
      // Zabezpieczenie przed CSS wskutek podaniem parametru innego niż liczba....
      if ((typeof number) == "string") {
        number = parseInt(number);
        this.OutputToConsole("Odczytywanie pojedyńczego ustawienia - błędne sformułowanie parametru number (jest ciągiem), konwertuję na liczbę");
      }
      var retdata = this.getScriptsSettings(commid)[number];
      if (((typeof retdata) != "undefined") && ((typeof retdata) != "object")) {
        this.OutputToConsole("Odczytywanie pojedyńczego ustawienia - przekazywanie ustawienia numer " + number.toString() + " dla skryptu o identyfikatorze " + commid);
        return retdata;
      } else {
        this.OutputToConsole("Odczytywanie pojedyńczego ustawienia - brak parametru do przekazania skryptowi o identyfikatorze " + commid);
        return false;
      }
    },
    
    // Wypada trochę funkcji poskracać, zwłaszacza tych o długich nazwach. (NOWOŚĆ OD 2.5!)
    CONS : this.OutputToConsole,
    $CLS : this.getElementsByClass,
    RSet : this.ReadSettingsCookie,
    PSet : this.ParseSettingsCookie,
    SSet : this.ParseSavableSettingsCookie,
    RCap : this.ReadCaptureCookie,
    PCap : this.ParseCaptureCookie,
    RTmp : this.ReadTempCookie,
    PTmp : this.ParseTempCookie,
    STmp : this.ParseSavableTempCookie,
    $VID : this.getVillageId,
    LLoy : this.getLoyaltyFromOV,
    $SET : this.getScriptsSettings,
    $TMP : this.getTemporaryData,
    $VPE : this.ExportToVPE,
    SETP : this.RenderSettingsPage,
    SSdS : this.SetSingleSetting,
    DSdS : this.DescendSingleSetting
}

// Uruchomienie wsadowe niektórych funkcji standardowych....
PlemionaRuntimeAgent.InitializeDebuger();
PlemionaRuntimeAgent.InitializeCaptureObject();
PlemionaRuntimeAgent.LoginTimer();
PlemionaRA2TempIdents = window.setInterval("try {PlemionaRuntimeAgent.loadTemporaryIdentifiers(); clearInterval(PlemionaRA2TempIdents);} catch (evt) {PlemionaRuntimeAgent.OutputToConsole(\"Pierwsze podejście nieudane, próbuję za 600 ms. \" + evt);}", 600);
PlemionaRA2Loading = window.setInterval("try {if (document.URL.match(/screen=overview(?!_villages)/)) {PlemionaRuntimeAgent.getInfoFromOverview(); clearInterval(PlemionaRA2Loading);} else {clearInterval(PlemionaRA2Loading);};} catch (evt) {PlemionaRuntimeAgent.OutputToConsole(\"Pierwsze podejście nieudane, próbuję za 600 ms. \" + evt);}", 600);
window.setTimeout("PlemionaRA2Updater = window.setInterval(\"try {PlemionaRuntimeAgent.UpdateNotifier(); clearInterval(PlemionaRA2Updater);} catch (evt) {PlemionaRuntimeAgent.OutputToConsole(\\\"Pierwsze podejście nieudane, próbuję za 600 ms. \\\" + evt);}\", 600);", 4000);
tempdata = PlemionaRuntimeAgent.ParseTempCookie(PlemionaRuntimeAgent.ReadTempCookie());
}

// A teraz uwaga z uruchamianiem:
// Obejście problemów z owrapowanym DOM w FF i Chrome związanym z szybkim ładowaniem
// (jeśli skrypty ładują się przed załadowaniem JQuery, krzaczy się w zasadzie wszystko).
// W FF uciekamy z problemu pnąc się pod unsafeWindow. W Chrome wystarczy wstrzyknąć kod.
if ((typeof GM_getResourceURL) != "undefined") {
  unsafeWindow.PlemionaRuntimeAgent = {};
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.innerHTML = "(" + PRASWrapper + ")();";
  script.charset = "utf-8";
  document.body.appendChild(script);
} else if ((typeof webkitStorageInfo) != "undefined") {
  PlemionaRuntimeAgent = {};
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.innerHTML = "(" + PRASWrapper + ")();";
  script.charset = "utf-8";
  document.body.appendChild(script);
} else {
  var PlemionaRuntimeAgent, PlemionaRA2TempIdents, PlemionaRA2Updater, PlemionaRA2Loading, tempdata;
  PlemionaRA2Loading = window.setInterval("if ((typeof jQuery) != \"undefined\") {try {clearInterval(PlemionaRA2Loading);PRASWrapper();} catch (evt) {}}", 500);
}